package com.itlnn.xfhttp;

import com.itlnn.xfhttp.able.HttpListener;
import com.itlnn.xfhttp.able.OnLoadingListener;
import com.itlnn.xfhttp.bean.Error;
import com.itlnn.xfhttp.comment.HttpUtils;
import com.yolanda.nohttp.RequestMethod;
import com.yolanda.nohttp.rest.JsonArrayRequest;
import com.yolanda.nohttp.rest.JsonObjectRequest;
import com.yolanda.nohttp.rest.Response;
import com.yolanda.nohttp.rest.RestRequest;
import com.yolanda.nohttp.rest.StringRequest;

import java.util.Map;

/**
 * 网络请求处理的原始基类
 * @User :      xuyuqiang
 * @Date :      2016/12/27 下午2:07
 * @Version :   1.0.0
 * @ClassName : BaseXfHttp
 **/
public class BaseXfHttp implements HttpListener{
    /** 制定返回数据类型为String （默认） */
    public static final int STRINGREQUEST = 1 ;
    /** 制定返回数据类型为jsonObject */
    public static final int JSONREQUEST = 2 ;
    /** 指定返回数据返回类型为jsonarrary */
    public static final int JSONARRAYREQUEST = 3 ;

    /** 网络请求返回接口 */
    protected OnLoadingListener loadingListener ;
    /** 网络请求的reqeust */
    protected RestRequest request ;
    /** 请求是否可以取消 默认不可以*/
    protected boolean cancel = false;
    /** 网络请求标识 默认为-1 */
    protected int what = -1;

    /**
     * http的网络基类构造
     *          根据返回数据类型初始化不同的Request
     * @param url                   请求URL
     * @param method                请求类型：post或get
     * @param requestType           返回的数据类型
     * @param loadingListener       返回监听
     */
    public BaseXfHttp(String url , RequestMethod method , int requestType , OnLoadingListener loadingListener ){
        this.loadingListener = loadingListener ;
        switch (requestType){
            case STRINGREQUEST:
                request = new StringRequest(url , method) ;
                break;
            case JSONREQUEST:
                request = new JsonObjectRequest(url , method) ;
                break;
            case JSONARRAYREQUEST:
                request = new JsonArrayRequest(url , method) ;
                break;
        }

    }

    /**
     * 设置请求标识 默认为-1
     * @param what    请求类型
     */
    public void setWhat(int what){
        this.what = what ;
    }

    /**
     * 设置网络请求是否可以取消 默认为false 不可以
     * @param cancel    是否取消标识
     */
    public void setCancel(boolean cancel){
        this.cancel = cancel ;
    }

    /**
     * 设置HOST
     * @param key       host的key
     * @param value     host的value
     */
    public void setHost(String key , String value){
        if (request != null){
            request.addHeader(key , value);
        }
    }

    /**
     * 设置请求参数
     * @param key       服务的要求的参数名字
     * @param params    需要封装的参数，最终会组装成一个json对象
     */
    public void setParams(String key , Map<String , Object> params){
        if (params != null){
            request.add(key , HttpUtils.initJsonUrl(params));
        }
    }

    /**
     * 设置网络请求的取消标识
     * @param sign    请求对象标识 ， 可以更加此标识取消本次请求
     */
    public void setCancelSign(Object sign){
        if (request != null){
            request.setCancelSign(sign);
        }
    }

    /**
     * 设置超时时间
     * @param millis    超时时间，单位毫秒
     */
    public void setConnectTimeout(int millis){
        if (request != null){
            request.setConnectTimeout(millis);
        }
    }

    /**
     * 开始网络请求
     */
    public void startRequest(){
        if (request instanceof JsonObjectRequest){
            XfHttpRequestServer.getInstance().addRequest(what , (JsonObjectRequest) request , this);
        }else if (request instanceof JsonArrayRequest){
            XfHttpRequestServer.getInstance().addRequest(what , (JsonArrayRequest) request , this);
        }else{
            XfHttpRequestServer.getInstance().addRequest(what , (StringRequest) request , this);
        }
    }

    @Override
    public void onSucceed(int what, Response response) {
        if (loadingListener != null){
            loadingListener.onSuccessed(what , response.get());
        }
    }

    @Override
    public void onFailed(int what, Response response) {
        if (loadingListener != null){
            Error error = new Error() ;
            error.code = response.hashCode() ;
            error.msg = response.responseMessage() ;
            error.networkMillis = response.getNetworkMillis() ;
            error.what = what ;
            loadingListener.onFilded(what , error);
        }
    }

    /**
     * 取消指定网络请求
     * @param sign
     *          请求标识
     */
    public void cancelBySign(Object sign){
        XfHttpRequestServer.getInstance().cancelBySign(sign);
    }

    /**
     * 取消队列中所有请求
     */
    public void cancelAll() {
        XfHttpRequestServer.getInstance().cancelAll();
    }

    /**
     * 退出app时停止所有请求
     */
    public void stopAll() {
        XfHttpRequestServer.getInstance().stopAll();
    }
}
